home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 3006 / 3006.xpi / components / dhMedialinkProbe.js < prev    next >
Text File  |  2010-01-15  |  10KB  |  294 lines

  1. /******************************************************************************
  2.  *            Copyright (c) 2006-2009 Michel Gutierrez. All Rights Reserved.
  3.  ******************************************************************************/
  4.  
  5. /**
  6.  * Constants.
  7.  */
  8.  
  9. const NS_MLPROBE_CID = Components.ID("{7f3707a8-34b9-488d-a861-ffcb0a3e0c29}");
  10. const NS_MLPROBE_PROG_ID = "@downloadhelper.net/medialink-probe;1";
  11. const DHNS = "http://downloadhelper.net/1.0#";
  12.  
  13. var Util=null;
  14.  
  15. /**
  16. * Object constructor
  17. */
  18. function MLProbe() {
  19.     try {
  20.         //dump("[MLProbe] constructor\n");
  21.         var prefService=Components.classes["@mozilla.org/preferences-service;1"]
  22.                                            .getService(Components.interfaces.nsIPrefService);
  23.         this.pref=prefService.getBranch("dwhelper.");
  24.         this.mediaPattern="jpg|jpeg|gif|png|mpg|mpeg|avi|rm|wmv|mov|flv";
  25.         this.minFileCount=2;
  26.         this.core=Components.classes["@downloadhelper.net/core;1"].
  27.             getService(Components.interfaces.dhICore);
  28.         this.core.registerProbe(this);
  29.     } catch(e) {
  30.         dump("[MLProbe] !!! constructor: "+e+"\n");
  31.     }
  32. }
  33.  
  34. MLProbe.prototype = {}
  35.  
  36. MLProbe.prototype.handleDocument=function(document,window) {
  37.     try {
  38.         //dump("[MLProbe] handleDocument("+document.URL+")\n");
  39.  
  40.         var medialinkEnabled=true;
  41.         try {
  42.             medialinkEnabled=this.pref.getBoolPref("enable-medialink-method");
  43.         } catch(e) {
  44.         }
  45.         if(medialinkEnabled==false)
  46.             return;
  47.  
  48.         var dom=document.documentElement;
  49.         var classes={};
  50.         var allHRefs={};
  51.         var mediaNodes=[];
  52.         var hitCount=0;
  53.         var hitCountMax=this.pref.getIntPref("medialink-max-hits");
  54.         var aNodes=Util.xpGetNodes(dom,".//a[@href]",{});
  55.         for(var i=0;i<aNodes.length;i++) {
  56.             var aNode=aNodes[i];
  57.             var href=aNode.getAttribute("href");
  58.             if(allHRefs[href]!=null)
  59.                 continue;
  60.             allHRefs[href]="";
  61.             var mediaPattern=this.mediaPattern;
  62.             try {
  63.                 mediaPattern=this.pref.getCharPref("medialink-extensions");
  64.             } catch(e) {}
  65.             var mPatt=new RegExp("^.*\\.(?:"+mediaPattern+")$","i");
  66.             if(mPatt.exec(href)==null)
  67.                 continue;
  68.             mediaNodes.push(aNode);
  69.             
  70.             var hrefParts=/^(.*[^0-9])?([0-9]+)([^\/]*?\.[^\/]*?)$/.exec(href);
  71.             if(hrefParts!=null && hrefParts.length==4) {
  72.                 if(hrefParts[1]==undefined)
  73.                     hrefParts[1]="";
  74.                 var key=hrefParts[1]+"$$$"+hrefParts[3];
  75.                 var group=classes[key];
  76.                 if(group==null) {
  77.                     group={
  78.                         nodes: [],
  79.                         ext: /.*\.(.*?)$/.exec(hrefParts[3])[1],
  80.                     };
  81.                     classes[key]=group;
  82.                 }
  83.                 var classNodes=group.nodes;
  84.                 classNodes.push(aNode);
  85.             }
  86.             hitCount++;
  87.             if(isNaN(hitCountMax)==false && hitCountMax>0 && hitCount>=hitCountMax)
  88.                 break;
  89.         }
  90.         this.groups=[];
  91.         var groupIndex=0;
  92.         var maxNodeCount=0;
  93.         for(var i in classes) {
  94.             var group=classes[i];
  95.             var classNodes=group.nodes;
  96.             if(maxNodeCount<classNodes.length)
  97.                 maxNodeCount=classNodes.length;
  98.             if(classNodes.length>=this.minFileCount) {
  99.                 var desc=this.getDesc(document,group.ext+" ("+classNodes.length+")",group.nodes)
  100.                 this.core.addEntryForDocument(desc,document,window);
  101.             }
  102.         }
  103.         if(maxNodeCount<mediaNodes.length) {
  104.             var desc=this.getDesc(document,Util.getText("menu.alllinkstomedia")+" ("+mediaNodes.length+")",mediaNodes);
  105.             this.core.addEntryForDocument(desc,document,window);
  106.         }
  107.         return;
  108.     } catch(e) {
  109.         dump("!!! [MLProbe] handleDocument("+document.URL+"): "+Util.exceptionDesc(e)+"\n");
  110.     }
  111. }
  112.  
  113. MLProbe.prototype.getDesc = function(document,label,nodes) {
  114.     var desc=Components.classes["@mozilla.org/properties;1"].
  115.         createInstance(Components.interfaces.nsIProperties);
  116.     Util.setPropsString(desc,"page-url",document.URL);
  117.     Util.setPropsString(desc,"referrer",document.URL);
  118.     Util.setPropsString(desc,"label",label);                
  119.     Util.setPropsString(desc,"icon-url","chrome://dwhelper/skin/medialink.gif");
  120.     Util.setPropsString(desc,"capture-method","medialink");
  121.     Util.setPropsString(desc,"sn-preserve-label","yes");
  122.     desc.set("mouse-listener",this);
  123.     
  124.     var fdescs=Components.classes["@mozilla.org/array;1"].
  125.         createInstance(Components.interfaces.nsIMutableArray);
  126.     desc.set("links",fdescs);
  127.     for(var j=0;j<nodes.length;j++) {
  128.         var node=nodes[j];
  129.         var ndesc=Components.classes["@mozilla.org/properties;1"].
  130.             createInstance(Components.interfaces.nsIProperties);
  131.         var href=node.getAttribute("href");
  132.         var url = Components.classes["@mozilla.org/network/standard-url;1"].createInstance(Components.interfaces.nsIURI);
  133.         url.spec = document.URL;
  134.         var urlStr=url.resolve(href);
  135.         Util.setPropsString(ndesc,"media-url",urlStr);
  136.         ndesc.set("node",node);
  137.         fdescs.appendElement(ndesc,false);
  138.     }
  139.     return desc;
  140. }
  141.  
  142. MLProbe.prototype.mouseOver = function(desc) {
  143.     //dump("[MLProbe] mouseOver()\n");
  144.     try {
  145.         if(desc.has("links")) {
  146.             var links=desc.get("links",Components.interfaces.nsIArray);
  147.             var i=links.enumerate();
  148.             while(i.hasMoreElements()) {
  149.                 var ndesc=i.getNext().QueryInterface(Components.interfaces.nsIProperties);
  150.                 if(ndesc.has("node")) {
  151.                     var aNode=ndesc.get("node",Components.interfaces.nsIDOMNode);
  152.                     var oldBorder=aNode.style.border;
  153.                     aNode.setAttribute("dwhelper-border",oldBorder);
  154.                     aNode.style.border="5px dashed Red";
  155.                     var oldDisplay=aNode.style.display;
  156.                     aNode.setAttribute("dwhelper-display",oldDisplay);
  157.                     aNode.style.display="block";
  158.                 }
  159.             }
  160.         }
  161.     } catch(e) {
  162.         dump("!!! [MLProbe] mouseOver(): "+Util.exceptionDesc(e)+"\n");
  163.     }
  164. }
  165.  
  166. MLProbe.prototype.mouseOut = function(desc) {
  167.     //dump("[MLProbe] mouseOut()\n");
  168.     try {
  169.         if(desc.has("links")) {
  170.             var links=desc.get("links",Components.interfaces.nsIArray);
  171.             var i=links.enumerate();
  172.             while(i.hasMoreElements()) {
  173.                 var ndesc=i.getNext().QueryInterface(Components.interfaces.nsIProperties);
  174.                 if(ndesc.has("node")) {
  175.                     var aNode=ndesc.get("node",Components.interfaces.nsIDOMNode);
  176.                     var oldBorder=aNode.getAttribute("dwhelper-border");
  177.                     aNode.style.border=oldBorder;
  178.                     var oldDisplay=aNode.getAttribute("dwhelper-display");
  179.                     aNode.style.display=oldDisplay;
  180.                 }
  181.             }
  182.         }
  183.     } catch(e) {
  184.         dump("!!! [MLProbe] mouseOut(): "+Util.exceptionDesc(e)+"\n");
  185.     }
  186. }
  187.  
  188. MLProbe.prototype.handleRequest=function(request) {
  189. }
  190.     
  191. MLProbe.prototype.handleResponse=function(request) {
  192. }
  193.     
  194. MLProbe.prototype.QueryInterface = function(iid) {
  195.     //dump("[MLProbe] QueryInterface("+iid+")\n");
  196.     if(
  197.         iid.equals(Components.interfaces.dhIProbe) ||
  198.         iid.equals(Components.interfaces.dhIProbeMouseListener) ||
  199.         iid.equals(Components.interfaces.nsISupports)
  200.     ) {
  201.         return this;
  202.     }
  203.     throw Components.results.NS_ERROR_NO_INTERFACE;
  204. }
  205.  
  206. var vMLProbeModule = {
  207.     firstTime: true,
  208.     
  209.     /*
  210.      * RegisterSelf is called at registration time (component installation
  211.      * or the only-until-release startup autoregistration) and is responsible
  212.      * for notifying the component manager of all components implemented in
  213.      * this module.  The fileSpec, location and type parameters are mostly
  214.      * opaque, and should be passed on to the registerComponent call
  215.      * unmolested.
  216.      */
  217.     registerSelf: function (compMgr, fileSpec, location, type) {
  218.  
  219.         if (this.firstTime) {
  220.             this.firstTime = false;
  221.             throw Components.results.NS_ERROR_FACTORY_REGISTER_AGAIN;
  222.         }
  223.         compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
  224.         compMgr.registerFactoryLocation(NS_MLPROBE_CID,
  225.                                         "MLProbe",
  226.                                         NS_MLPROBE_PROG_ID, 
  227.                                         fileSpec,
  228.                                         location,
  229.                                         type);
  230.     },
  231.  
  232.     unregisterSelf: function(compMgr, fileSpec, location) {
  233.         compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
  234.         compMgr.unregisterFactoryLocation(NS_DH_MLPROBE_CID, fileSpec);
  235.     },
  236.  
  237.     /*
  238.      * The GetClassObject method is responsible for producing Factory and
  239.      * SingletonFactory objects (the latter are specialized for services).
  240.      */
  241.     getClassObject: function (compMgr, cid, iid) {
  242.         if (!cid.equals(NS_MLPROBE_CID)) {
  243.             throw Components.results.NS_ERROR_NO_INTERFACE;
  244.         }
  245.  
  246.         if (!iid.equals(Components.interfaces.nsIFactory)) {
  247.             throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
  248.         }
  249.  
  250.         return this.vMLProbeFactory;
  251.     },
  252.  
  253.     /* factory object */
  254.     vMLProbeFactory: {
  255.         /*
  256.          * Construct an instance of the interface specified by iid, possibly
  257.          * aggregating it with the provided outer.  (If you don't know what
  258.          * aggregation is all about, you don't need to.  It reduces even the
  259.          * mightiest of XPCOM warriors to snivelling cowards.)
  260.          */
  261.         createInstance: function (outer, iid) {
  262.             if (outer != null) {
  263.                 throw Components.results.NS_ERROR_NO_AGGREGATION;
  264.             }
  265.     
  266.             if(Util==null) 
  267.                 Util=Components.classes["@downloadhelper.net/util-service;1"]
  268.                     .getService(Components.interfaces.dhIUtilService);
  269.  
  270.             return new MLProbe().QueryInterface(iid);
  271.         }
  272.     },
  273.  
  274.     /*
  275.      * The canUnload method signals that the component is about to be unloaded.
  276.      * C++ components can return false to indicate that they don't wish to be
  277.      * unloaded, but the return value from JS components' canUnload is ignored:
  278.      * mark-and-sweep will keep everything around until it's no longer in use,
  279.      * making unconditional ``unload'' safe.
  280.      *
  281.      * You still need to provide a (likely useless) canUnload method, though:
  282.      * it's part of the nsIModule interface contract, and the JS loader _will_
  283.      * call it.
  284.      */
  285.     canUnload: function(compMgr) {
  286.         return true;
  287.     }
  288. };
  289.  
  290. function NSGetModule(compMgr, fileSpec) {
  291.     return vMLProbeModule;
  292. }
  293.  
  294.